--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sbapp/kivymd/uix/circularlayout.py f8b3e3760b831745cf10d97aeae64e9c00a136a9 (f8b3e376) Text, 5.51 KB
T8b949e"""
Components/CircularLayout
=========================
CircularLayout is a special layout that places widgets around a circle.
MDCircularLayout
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.. rubric:: Usage
.. code-block::
from kivy.lang.builder import Builder
from kivy.uix.label import Label
from kivymd.app import MDApp
kv = '''
MDScreen:
MDCircularLayout:
id: container
pos_hint: {"center_x": .5, "center_y": .5}
row_spacing: min(self.size) * 0.1
'''
class Main(MDApp):
def build(self):
return Builder.load_string(kv)
def on_start(self):
for x in range(1, 49):
self.root.ids.container.add_widget(
Label(text=f"{x}", color=[0, 0, 0, 1])
)
Main().run()
.. image:: https://github.com/HeaTTheatR/KivyMD-data/raw/master/gallery/kivymddoc/circular-layout.png
:align: center
"""
Te6edf3__all__ Tff7b72= Tb4b4b4(Ta5d6ff"Ta5d6ffMDCircularLayoutTa5d6ff"Tb4b4b4,Tb4b4b4)
Tff7b72from T7ee787math Tff7b72import Te6edf3atan2Tb4b4b4, Te6edf3cosTb4b4b4, Te6edf3degreesTb4b4b4, Te6edf3radiansTb4b4b4, Te6edf3sin
Tff7b72from T7ee787kivyT7ee787.T7ee787properties Tff7b72import Te6edf3BooleanPropertyTb4b4b4, Te6edf3NumericProperty
Tff7b72from T7ee787kivymdT7ee787.T7ee787uixT7ee787.T7ee787floatlayout Tff7b72import Te6edf3MDFloatLayout
Tff7b72class T56d364MDCircularLayoutTb4b4b4(Te6edf3MDFloatLayoutTb4b4b4)Tb4b4b4:
Te6edf3degree_spacing Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff30Tb4b4b4)
T8b949e"""
The space between children in degree.
:attr:`degree_spacing` is an :class:`~kivy.properties.NumericProperty`
and defaults to `30`.
"""
Te6edf3circular_radius Tff7b72= Te6edf3NumericPropertyTb4b4b4(Tff7b72NoneTb4b4b4, Te6edf3allownoneTff7b72=Tff7b72TrueTb4b4b4)
T8b949e"""
Radius of circle. Radius will be the greatest value in the layout if `circular_radius` if not specified.
:attr:`circular_radius` is an :class:`~kivy.properties.NumericProperty`
and defaults to `None`.
"""
Te6edf3start_from Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff60Tb4b4b4)
T8b949e"""
The positon of first child in degree.
:attr:`start_from` is an :class:`~kivy.properties.NumericProperty`
and defaults to `60`.
"""
Te6edf3max_degree Tff7b72= Te6edf3NumericPropertyTb4b4b4(T79c0ff360Tb4b4b4)
T8b949e"""
Maximum range in degree allowed for each row of widgets before jumping to the next row.
:attr:`max_degree` is an :class:`~kivy.properties.NumericProperty`
and defaults to `360`.
"""
Te6edf3circular_padding Tff7b72= Te6edf3NumericPropertyTb4b4b4(Ta5d6ff"Ta5d6ff25dpTa5d6ff"Tb4b4b4)
T8b949e"""
Padding between outer widgets and the edge of the biggest circle.
:attr:`circular_padding` is an :class:`~kivy.properties.NumericProperty`
and defaults to `25dp`.
"""
Te6edf3row_spacing Tff7b72= Te6edf3NumericPropertyTb4b4b4(Ta5d6ff"Ta5d6ff50dpTa5d6ff"Tb4b4b4)
T8b949e"""
Space between each row of widget.
:attr:`row_spacing` is an :class:`~kivy.properties.NumericProperty`
and defaults to `50dp`.
"""
Te6edf3clockwise Tff7b72= Te6edf3BooleanPropertyTb4b4b4(Tff7b72TrueTb4b4b4)
T8b949e"""
Direction of widgets in circular direction.
:attr:`clockwise` is an :class:`~kivy.properties.BooleanProperty`
and defaults to `True`.
"""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbindTb4b4b4(
Te6edf3row_spacingTff7b72=Tff7b72selfTff7b72.Td2a8ff_update_layoutTb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8ffget_angleTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3posTb4b4b4: Tffa657tupleTb4b4b4) Tff7b72-Tff7b72> Tffa657floatTb4b4b4:
T8b949e"""Returns the angle of given pos."""
Te6edf3center Tff7b72= Tb4b4b4[Tff7b72selfTff7b72.Td2a8ffposTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72+ Tff7b72selfTff7b72.Td2a8ffwidth Tff7b72/ T79c0ff2Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffposTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72+ Tff7b72selfTff7b72.Td2a8ffheight Tff7b72/ T79c0ff2Tb4b4b4]
Tb4b4b4(Te6edf3dxTb4b4b4, Te6edf3dyTb4b4b4) Tff7b72= Tb4b4b4(Te6edf3centerTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72- Te6edf3posTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3centerTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72- Te6edf3posTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Te6edf3angle Tff7b72= Te6edf3degreesTb4b4b4(Te6edf3atan2Tb4b4b4(Tffa657floatTb4b4b4(Te6edf3dyTb4b4b4)Tb4b4b4, Tffa657floatTb4b4b4(Te6edf3dxTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3angle Tff7b72+Tff7b72= T79c0ff180
Tff7b72return Te6edf3angle
Tff7b72def Td2a8ffremove_widgetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3widgetTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffremove_widgetTb4b4b4(Te6edf3widgetTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_update_layoutTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffdo_layoutTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3largsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_update_layoutTb4b4b4(Tb4b4b4)
Tff7b72return Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffdo_layoutTb4b4b4(Tff7b72*Te6edf3largsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72def Td2a8ff_max_per_rowTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmax_degree Tff7b72/ Tff7b72selfTff7b72.Td2a8ffdegree_spacingTb4b4b4)
Tff7b72def Td2a8ff_update_layoutTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3indexTb4b4b4, Te6edf3child Tff7b72in Tffa657enumerateTb4b4b4(Tffa657reversedTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchildrenTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3pos Tff7b72= Tff7b72selfTff7b72.Td2a8ff_point_on_circleTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_calculate_radiusTb4b4b4(Te6edf3indexTb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ff_calculate_degreeTb4b4b4(Te6edf3indexTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3childTff7b72.Td2a8ffcenter Tff7b72= Te6edf3pos
Tff7b72def Td2a8ff_calculate_radiusTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3indexTb4b4b4)Tb4b4b4:
T8b949e"""Calculates the radius for given index."""
Te6edf3idx Tff7b72= Tffa657intTb4b4b4(Te6edf3index Tff7b72/ Tff7b72selfTff7b72.Td2a8ff_max_per_rowTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffcircular_radiusTb4b4b4:
Te6edf3init_radius Tff7b72= Tb4b4b4(
Tffa657minTb4b4b4(Tb4b4b4[Tff7b72selfTff7b72.Td2a8ffwidth Tff7b72/ T79c0ff2Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffheight Tff7b72/ T79c0ff2Tb4b4b4]Tb4b4b4) Tff7b72- Tff7b72selfTff7b72.Td2a8ffcircular_padding
Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3init_radius Tff7b72= Tff7b72selfTff7b72.Td2a8ffcircular_radius
Tff7b72if Te6edf3idx Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3space Tff7b72= Tff7b72selfTff7b72.Td2a8ffrow_spacing Tff7b72* Te6edf3idx
Te6edf3init_radius Tff7b72-Tff7b72= Te6edf3space
Tff7b72return Te6edf3init_radius
Tff7b72def Td2a8ff_calculate_degreeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3indexTb4b4b4)Tb4b4b4:
T8b949e"""Calculates the angle for given index."""
Tff7b72if Tff7b72selfTff7b72.Td2a8ffclockwiseTb4b4b4:
Te6edf3degree Tff7b72= Tff7b72selfTff7b72.Td2a8ffstart_from Tff7b72- Te6edf3index Tff7b72* Tff7b72selfTff7b72.Td2a8ffdegree_spacing
Tff7b72elseTb4b4b4:
Te6edf3degree Tff7b72= Tff7b72selfTff7b72.Td2a8ffstart_from Tff7b72+ Te6edf3index Tff7b72* Tff7b72selfTff7b72.Td2a8ffdegree_spacing
Tff7b72return Te6edf3degree
Tff7b72def Td2a8ff_point_on_circleTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3radiusTb4b4b4, Te6edf3degreeTb4b4b4)Tb4b4b4:
Te6edf3angle Tff7b72= Te6edf3radiansTb4b4b4(Te6edf3degreeTb4b4b4)
Te6edf3center Tff7b72= Tb4b4b4[Tff7b72selfTff7b72.Td2a8ffposTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72+ Tff7b72selfTff7b72.Td2a8ffwidth Tff7b72/ T79c0ff2Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffposTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72+ Tff7b72selfTff7b72.Td2a8ffheight Tff7b72/ T79c0ff2Tb4b4b4]
Te6edf3x Tff7b72= Te6edf3centerTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72+ Tb4b4b4(Te6edf3radius Tff7b72* Te6edf3cosTb4b4b4(Te6edf3angleTb4b4b4)Tb4b4b4)
Te6edf3y Tff7b72= Te6edf3centerTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72+ Tb4b4b4(Te6edf3radius Tff7b72* Te6edf3sinTb4b4b4(Te6edf3angleTb4b4b4)Tb4b4b4)
Tff7b72return Tb4b4b4[Te6edf3xTb4b4b4, Te6edf3yTb4b4b4]
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Tff7b72from T7ee787kivyT7ee787.T7ee787langT7ee787.T7ee787builder Tff7b72import Te6edf3Builder
Tff7b72from T7ee787kivyT7ee787.T7ee787uixT7ee787.T7ee787label Tff7b72import Te6edf3Label
Tff7b72from T7ee787kivymdT7ee787.T7ee787app Tff7b72import Te6edf3MDApp
Te6edf3kv Tff7b72= Ta5d6ff"""
Ta5d6ffMDScreen:
Ta5d6ff MDCircularLayout:
Ta5d6ff id: container
Ta5d6ff pos_hint: Ta5d6ff{Ta5d6ff"Ta5d6ffcenter_xTa5d6ff"Ta5d6ff: .5, Ta5d6ff"Ta5d6ffcenter_yTa5d6ff"Ta5d6ff: .5}
Ta5d6ff row_spacing: min(self.size) * 0.1
Ta5d6ff Ta5d6ff"""
Tff7b72class T56d364MainTb4b4b4(Te6edf3MDAppTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffbuildTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3BuilderTff7b72.Td2a8ffload_stringTb4b4b4(Te6edf3kvTb4b4b4)
Tff7b72def Td2a8ffon_startTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3x Tff7b72in Tffa657rangeTb4b4b4(T79c0ff1Tb4b4b4, T79c0ff49Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrootTff7b72.Td2a8ffidsTff7b72.Td2a8ffcontainerTff7b72.Td2a8ffadd_widgetTb4b4b4(
Te6edf3LabelTb4b4b4(Te6edf3textTff7b72=Ta5d6fffTa5d6ff"Tffd700{Te6edf3xTffd700}Ta5d6ff"Tb4b4b4, Te6edf3colorTff7b72=Tb4b4b4[T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, T79c0ff1Tb4b4b4]Tb4b4b4)
Tb4b4b4)
Te6edf3MainTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────